//
//  StatusListViewModel.swift
//  基于Swift的微博设计与实现
//
//  Created by 张源海 on 15/11/27.
//  Copyright © 2015年 张源海. All rights reserved.
//

import Foundation
import SDWebImage

/// 微博数据列表模型 － 封装网络方法
class StatusListViewModel {
    
    /// 微博数据数组 - 上拉/下拉刷新
    lazy var statusList = [StatusViewModel]()
    /// 下拉刷新计数
    var pulldownCount: Int?
    
    /// 加载网络数据
    func loadStatus(isPullup isPullup: Bool, finished: (isSuccessed: Bool)->()) {
        
        // 下拉刷新 id
        let since_id = isPullup ? 0 : (statusList.first?.status.id ?? 0)
        // 上拉刷新 id
        let max_id = isPullup ? (statusList.last?.status.id ?? 0) : 0
        
        NetworkTools.sharedTools.loadStatus(since_id: since_id, max_id: max_id) { (result, error) -> () in
            if error != nil {
                print("出错了")
                
                finished(isSuccessed: false)
                return
            }
            
            // 判断 result 的数据结构是否争取
            guard let array = result?["statuses"] as? [[String: AnyObject]] else {
                print("数据格式错误")
                
                finished(isSuccessed: false)
                return
            }
            
            // 遍历字典的数组，字典转模型
            // 1. 可变的数组
            var dataList = [StatusViewModel]()
            
            // 2. 遍历数组
            for dict in array {
                dataList.append(StatusViewModel(status: Status(dict: dict)))
            }
            
//            print("加载了 \(dataList.count) 条微博")
            self.pulldownCount = since_id > 0 ? dataList.count : nil
            
            // 3. 拼接数据
            if max_id > 0 {             // 上拉刷新，将新数据拼接在当前数组的末尾
                self.statusList += dataList
            } else {                    // 下拉或默认刷新，将新数据追加在当前数组的前面
                self.statusList = dataList + self.statusList
            }
            
            // 4. 缓存单张图片
            self.cacheSingleImage(dataList, finished: finished)
        }
    }
    
    /// 缓存单张图片
    private func cacheSingleImage(array: [StatusViewModel], finished: (isSuccessed: Bool)->()) {
        
        // 0. 调度组
        let group = dispatch_group_create()
        var dataLength = 0
        
        // 1. 遍历数组
        for vm in array {
            
            // 1> 判断图片数量是否只有一张图片
            if vm.thumbnailUrls?.count != 1 {
                continue
            }
            
            // 2> 提取第一张图片的 URL
            let url = vm.thumbnailUrls?.first
            
//            print("要缓存的 URL \(url)")
            
            // 3> 下载图像
            dispatch_group_enter(group)
            SDWebImageManager.sharedManager().downloadImageWithURL(url,
                options: [.RetryFailed, .RefreshCached],
                progress: nil) { (image, error, _, _, _) in
                    
                    if let img = image,
                        data = UIImagePNGRepresentation(img) {
                            
                            dataLength += data.length
                    }
                    
                    dispatch_group_leave(group)
            }
        }
        
        // 2. 监听调度组
        dispatch_group_notify(group, dispatch_get_main_queue()) {
//            print("缓存图像完成 \(dataLength / 1024) K")
            
            finished(isSuccessed: true)
        }
    }
}
